package IOSreamAndFile;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

public class file {
    public static void main(String[] args) {
        /*
        File类：可记录文件或者文件夹的路径，以及对文件或者文件夹的操作
                更直接理解成一个记录路径的String类，这个String类有自己的方法
        构造方法：
        1.File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
        2.File(String parent, String child) 从父路径名字符串和子路径名字符串创建一个新 File 实例
        3.File(File parent, String child) 从父抽象路径名和子路径名字符串创建一个新 File 实例
         */
        File f1 = new File("D:\\Users\\Downloads");//第一种构造方法
        File f2 = new File("D:\\Users\\Downloads", "1.txt");//第二种构造方法
        File parent = new File("D:\\Users\\Downloads");
        File f3 = new File(parent, "1.txt");//第三种构造方法
        //System.out.println(f1);//D:\Users\Downloads
        //System.out.println(f2);//D:\Users\Downloads\1.txt
        //System.out.println(f3);//D:\Users\Downloads\1.txt
        //当然路径可以是相对路径，也可以是绝对路径

        /*
        常用方法：
        获取文件相关信息的方法：
        1.public String getAbsolutePath(); //获取文件的绝对路径
        2.public String getName();//获取文件的名字
        3.public String getPath();//获取文件的路径
        4.public File getParentFile();//获取文件的父文件
        5.public String getParent();//获取文件的父文件路径
        6.public long length();//获取文件的大小
        7.public long lastModified();//获取文件最后修改时间
        */
        //1.String getAbsolutePath(); //获取文件的绝对路径
        String absolutePath = f3.getAbsolutePath();
        System.out.println(absolutePath);//D:\Users\Downloads\1.txt

        //2.String getName();//获取文件的名字(如果定义时候最后是文件夹，返回的就是文件夹的名字)
        String name = f3.getName();
        System.out.println(name);//1.txt

        //3.String getPath();//获取文件的路径(有无文件都返回路径本身)
        String path = f3.getPath();
        System.out.println(path);//D:\Users\Downloads\1.txt

        //4.File getParentFile();//获取文件的父文件
        File parentFile1 = f3.getParentFile();
        System.out.println(parentFile1);//D:\Users\Downloads

        //5.String getParent();//获取文件的父文件路径
        String parent1 = f3.getParent();
        System.out.println(parent1);//D:\Users\Downloads

        //6.long length();//获取文件的大小(单位是字节)
        long length = f3.length();
        System.out.println(length);//0

        //7.long lastModified();//获取文件最后修改时间(单位是毫秒)
        long lastModified = f3.lastModified();
        System.out.println(lastModified);//1702488714000
        //这个时间可以通过Date类来转换
        //Date date = new Date(lastModified);

        /*
        判断文件相关信息的方法：
        1.public boolean canRead();//是否可读
        2.public boolean canWrite();//是否可写
        3.public boolean exists();//是否存在
        4.public boolean isDirectory();//是否是目录
        5.public boolean isFile();//是否是一个正常的文件
        6.public boolean isHidden();//是否隐藏
        7.public boolean canExecute();//是否可执行
        8.public boolean createNewFile() throws IOException;//创建新的文件
        9.public boolean delete();//删除文件
        10.public boolean mkdir();//创建目录，一级
        11.public boolean mkdirs();//创建目录，多级
        12.public boolean renameTo(File dest);//文件重命名
        */
        File file = new File("D:\\Users\\Downloads\\1.txt");
        //判断文件是否可读
        boolean readable = file.canRead();
        System.out.println("文件是否可读：" + readable);
        //判断文件是否可写
        boolean writable = file.canWrite();
        System.out.println("文件是否可写：" + writable);
        //判断文件是否存在
        boolean exists = file.exists();
        System.out.println("文件是否存在：" + exists);
        //判断文件是否是目录
        boolean isDirectory = file.isDirectory();
        System.out.println("文件是否是目录：" + isDirectory);
        File parent2 = file.getParentFile();
        System.out.println("父级文件是否是目录：" + parent2.isDirectory());
        //判断文件是否是隐藏文件
        boolean hidden = file.isHidden();
        System.out.println("文件是否是隐藏文件：" + hidden);
        //判断文件是否可执行
        boolean executable = file.canExecute();
        //所谓的可执行文件，是指双击之后有反应的文件都称之为可执行文件
        System.out.println("文件是否可执行：" + executable);
        //创建文件夹
        File newFile = new File("F:\\test\\stu\\new.txt");
        File parentFile = newFile.getParentFile();
        if (!parentFile.exists()) {//通常会与创建目录的方法配合使用
            //创建父级目录，但只能创建一级
            // parentFile.mkdir();
            //创建多级父级目录
            parentFile.mkdirs();//一级多级都可以创建
        }
        //创建文件
        if (!newFile.exists()) {//先判断文件是否存在，不存在才创建
            try {
                //创建文件时，必须保证改文件的父级目录存在，否则，创建将报IO异常
                boolean success = newFile.createNewFile();
                System.out.println("文件创建是否成功：" + success);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //删除文件/文件夹,不走回收站，直接删除
        boolean deleteSuccess = file.delete();
        System.out.println("文件删除是否成功：" + deleteSuccess);
        //删除文件夹时，必须保证文件夹中没有任何文件，也就是保证文件夹是空的
        boolean deleteFolderSuccess = parentFile.delete();
        System.out.println("文件夹删除是否成功：" + deleteFolderSuccess);
        //文件重命名
        //文件重命名至目标文件夹时，必须保证目标文件夹存在。
        //重命名操作成功后，原来的文件就移动过去了。
        File renameDest = new File("F:\\test\\a.txt");
        boolean renameSuccess = newFile.renameTo(renameDest);
        System.out.println("文件重命名是否成功：" + renameSuccess);

      /*
        遍历文件夹方法
      1.public File[] listFiles();//列出文件夹下所有文件
      2.public File[] listFiles(FileFilter filter);//列出文件夹下所有满足条件的文件
        */
        //列出文件夹中所有文件
        File directory = new File("D:\\Code");
        //列出文件夹中所有文件
        File[] files = directory.listFiles();
        //需要做非空判断，因为目录可能是非法的，也就是可能不存在
        if(files != null){
             //传统for循环
             for(int i=0; i<files.length; i++){
             File file2 = files[i];
             System.out.println(file2.getPath());
             }
            //增强for循环
             for(File file7 : files){
             System.out.println(file7.getPath());
             }
        }

        //列出文件夹中所有满足条件的文件
        File folder = new File("F:\\Idea\\IntelliJ IDEA 2020.1\\bin");
        // class A implements FileFilter{
        // @Override
        // public boolean accept(File pathname) {
        // return false;
        // }
        //匿名内部类 => 相当于将类的名字隐藏起来
        FileFilter filter = new FileFilter() {
            //表示接受文件的条件
            @Override
            public boolean accept(File file) {
                String name = file.getName();//获取文件名，也包含后缀在内
        //返回文件名是否以.ext结尾
                return name.endsWith(".exe"); //startsWith("hello") 检测字符串是否以hello开始
            }
        };
        File[] childFiles = folder.listFiles(filter);
        if(childFiles != null)
            for(File file1: childFiles)
                System.out.println(file1.getPath());

    }//main方法结束

   //递归删除文件夹和文件
    public static void deleteFolder(File folder){
        if(folder.isDirectory()){//是文件夹就需要再进去看
            File[] files = folder.listFiles();
            if(files != null){
                for(File file: files){
                    if(file.isDirectory()){
                        deleteFolder(file);
                    } else {
                        file.delete();
                    }
                }
                folder.delete();//文件夹中文件删除完毕之后，文件夹也需要删除掉
            }
        } else {//不是文件夹，直接删除
            folder.delete();
        }
    }
}
